This is R Notebook present a process analysis of 746 completed, fully validated, and archived projects in the HOT Tasking Manager (HOT-TM). Process discovery was performed using bupaR, a suite of open-source R packages for business process data analysis.

# Import required libraries
suppressWarnings({
library(bupaverse)
library(reshape2)
library(gt)
library(scales)
library(readr)
library(dplyr)
library(magrittr)
library(ggplot2)
library(Hmisc)
library(stringr)
})

Read event data The files containing project info (projects.csv) and project states(eventlog.csv) are read.

event_log_df <- read.csv("splits_invalidations.csv", stringsAsFactors = FALSE, sep = ",")
projects <- read.csv("projects.csv", stringsAsFactors = FALSE, sep = ",")
event_log_df[c('projectId', 'task')] <- str_split_fixed(event_log_df$taskId, '_', 2)
projects$projectId <- as.character(projects$projectId)
event_log_df = merge(x = event_log_df, y = projects[,c("projectId","difficulty","priority")], by = "projectId")
event_log_df <- event_log_df %>%
  convert_timestamps(columns = c("start", "complete"), format = ymd_hms) %>%
  activitylog(case_id = "taskId", activity_id = "action", resource_id = "actionBy", timestamps = c("start", "complete"))
event_log_df <- event_log_df %>%  mutate(action_duration = difftime(as.POSIXct(`complete`), as.POSIXct(`start`), units = "mins"))

Project states

head(event_log_df)
# Log of 12 events consisting of:
2 traces 
5 cases 
6 instances of 2 activities 
1 resource 
Events occurred from 2021-12-01 04:45:26 until 2021-12-01 04:54:13 
 
# Variables were mapped as follows:
Case identifier:        taskId 
Activity identifier:        action 
Resource identifier:        actionBy 
Timestamps:     start, complete 

Project info

head(projects)

Summary of the eventlog

summary(event_log_df)
Number of events:  3702910
Number of cases:  312289
Number of traces:  19084
Number of distinct activities:  10
Average trace length:  11.85732

Start eventlog:  NA
End eventlog:  NA

  projectId            taskId             action            actionBy             start                           complete                        username        
 Length:1853074     Length:1853074     Length:1853074     Length:1853074     Min.   :2021-12-01 04:45:26.33   Min.   :2021-12-01 04:46:29.93   Length:1853074    
 Class :character   Class :character   Class :character   Class :character   1st Qu.:2022-06-24 17:40:18.63   1st Qu.:2022-06-24 13:23:49.07   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character   Median :2022-11-10 14:41:44.95   Median :2022-11-10 10:05:05.82   Mode  :character  
                                                                             Mean   :2022-11-18 20:48:41.79   Mean   :2022-11-18 16:25:08.50                     
                                                                             3rd Qu.:2023-03-23 15:15:46.61   3rd Qu.:2023-03-23 15:42:18.42                     
                                                                             Max.   :2023-11-30 14:31:20.80   Max.   :2023-11-30 14:31:20.81                     
                                                                                                              NA's   :3238                                       
 mappingLevel           task            difficulty          priority             .order        action_duration  
 Length:1853074     Length:1853074     Length:1853074     Length:1853074     Min.   :      1   Length:1853074   
 Class :character   Class :character   Class :character   Class :character   1st Qu.: 463269   Class :difftime  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character   Median : 926538   Mode  :numeric   
                                                                             Mean   : 926538                    
                                                                             3rd Qu.:1389806                    
                                                                             Max.   :1853074                    
                                                                                                                

Absolute frequency of states in the eventlog.

event_log_df %>% activity_frequency("activity")

Activity presence shows in what percentage of cases an activity is present.

event_log_df %>% activity_presence()
tmp <- event_log_df  %>% filter_trace_frequency(percentage = 0.85)
totalmapping <- tmp[tmp$action == "LOCKED_FOR_MAPPING",] %>% group_by(taskId) %>% summarise(mapping_duration = sum(action_duration)) 
totalmapping
totalvalidation <- tmp[tmp$action == "LOCKED_FOR_VALIDATION",] %>% group_by(taskId) %>% summarise(validation_duration = sum(action_duration)) 
totalvalidation
mappingvalidation = merge(totalmapping, totalvalidation, by='taskId', all=TRUE)
mappingvalidation[is.na(mappingvalidation)] = 0
mappingvalidation
mappingvalidation <- transform(mappingvalidation, morevalidation= ifelse(mapping_duration < validation_duration, 1, 0)) 
mean(mappingvalidation$morevalidation)*100
[1] 57.51616
tmp %>%  process_map(frequency("absolute"))

trace_explorer() with coverage argument n_traces = 10 shows the 10 most frequent in the event log.

event_log_df %>%    trace_explorer(n_traces = 10, show_labels = FALSE, coverage_labels = c("relative"))

In the temporal process map, the value of nodes and edges represent the median duration in days of activities and waiting times.

tmp1 <- tmp
tmp1 %>%  process_map(performance(median, "days"))
tmp1 <- tmp
tmp1 %>%  process_map(performance(median, "mins"))
event_log_df[event_log_df$difficulty == "EASY",] %>% activity_presence()
tmp <- event_log_df[event_log_df$difficulty == "EASY",]  %>% filter_trace_frequency(percentage = 0.85)
totalmapping <- tmp[tmp$action == "LOCKED_FOR_MAPPING",] %>% group_by(taskId) %>% summarise(mapping_duration = sum(action_duration)) 
totalmapping
totalvalidation <- tmp[tmp$action == "LOCKED_FOR_VALIDATION",] %>% group_by(taskId) %>% summarise(validation_duration = sum(action_duration)) 
totalvalidation
mappingvalidation = merge(totalmapping, totalvalidation, by='taskId', all=TRUE)
mappingvalidation[is.na(mappingvalidation)] = 0
mappingvalidation
mappingvalidation <- transform(mappingvalidation, morevalidation= ifelse(mapping_duration < validation_duration, 1, 0)) 
mean(mappingvalidation$morevalidation)*100
[1] 59.63736
tmp %>%  process_map(frequency("absolute"))

trace_explorer() with coverage argument n_traces = 10 shows the 10 most frequent in the event log.

tmp %>%    trace_explorer(n_traces = 10, show_labels = FALSE, coverage_labels = c("relative"))

In the temporal process map, the value of nodes and edges represent the median duration in days of activities and waiting times.

tmp1 <- tmp
tmp1 %>%  process_map(performance(median, "days"))
tmp1 <- tmp
tmp1 %>%  process_map(performance(median, "mins"))
event_log_df[event_log_df$difficulty == "MODERATE",] %>% activity_presence()
tmp <- event_log_df[event_log_df$difficulty == "MODERATE",]  %>% filter_trace_frequency(percentage = 0.85)
totalmapping <- tmp[tmp$action == "LOCKED_FOR_MAPPING",] %>% group_by(taskId) %>% summarise(mapping_duration = sum(action_duration)) 
totalmapping
totalvalidation <- tmp[tmp$action == "LOCKED_FOR_VALIDATION",] %>% group_by(taskId) %>% summarise(validation_duration = sum(action_duration)) 
totalvalidation
mappingvalidation = merge(totalmapping, totalvalidation, by='taskId', all=TRUE)
mappingvalidation[is.na(mappingvalidation)] = 0
mappingvalidation
mappingvalidation <- transform(mappingvalidation, morevalidation= ifelse(mapping_duration < validation_duration, 1, 0)) 
mean(mappingvalidation$morevalidation)*100
[1] 51.37316
tmp %>%  process_map(frequency("absolute"))

trace_explorer() with coverage argument n_traces = 10 shows the 10 most frequent in the event log.

tmp %>%    trace_explorer(n_traces = 10, show_labels = FALSE, coverage_labels = c("relative"))

In the temporal process map, the value of nodes and edges represent the median duration in days of activities and waiting times.

tmp1 <- tmp
tmp1 %>%  process_map(performance(median, "days"))
tmp1 <- tmp
tmp1 %>%  process_map(performance(median, "mins"))
event_log_df[event_log_df$difficulty == "CHALLENGING",] %>% activity_presence()
tmp <- event_log_df[event_log_df$difficulty == "CHALLENGING",]  %>% filter_trace_frequency(percentage = 0.85)
totalmapping <- tmp[tmp$action == "LOCKED_FOR_MAPPING",] %>% group_by(taskId) %>% summarise(mapping_duration = sum(action_duration)) 
totalmapping
totalvalidation <- tmp[tmp$action == "LOCKED_FOR_VALIDATION",] %>% group_by(taskId) %>% summarise(validation_duration = sum(action_duration)) 
totalvalidation
mappingvalidation = merge(totalmapping, totalvalidation, by='taskId', all=TRUE)
mappingvalidation[is.na(mappingvalidation)] = 0
mappingvalidation
mappingvalidation <- transform(mappingvalidation, morevalidation= ifelse(mapping_duration < validation_duration, 1, 0)) 
mean(mappingvalidation$morevalidation)*100
[1] 21.10187
tmp %>%  process_map(frequency("absolute"))

trace_explorer() with coverage argument n_traces = 10 shows the 10 most frequent in the event log.

tmp %>%    trace_explorer(n_traces = 10, show_labels = FALSE, coverage_labels = c("relative"))

In the temporal process map, the value of nodes and edges represent the median duration in days of activities and waiting times.

tmp1 <- tmp
tmp1 %>%  process_map(performance(median, "days"))
tmp1 <- tmp
tmp1 %>%  process_map(performance(median, "mins"))
event_log_df[event_log_df$priority == "LOW",] %>% activity_presence()
tmp <- event_log_df[event_log_df$priority == "LOW",]  %>% filter_trace_frequency(percentage = 0.85)
totalmapping <- tmp[tmp$action == "LOCKED_FOR_MAPPING",] %>% group_by(taskId) %>% summarise(mapping_duration = sum(action_duration)) 
totalmapping
totalvalidation <- tmp[tmp$action == "LOCKED_FOR_VALIDATION",] %>% group_by(taskId) %>% summarise(validation_duration = sum(action_duration)) 
totalvalidation
mappingvalidation = merge(totalmapping, totalvalidation, by='taskId', all=TRUE)
mappingvalidation[is.na(mappingvalidation)] = 0
mappingvalidation
mappingvalidation <- transform(mappingvalidation, morevalidation= ifelse(mapping_duration < validation_duration, 1, 0)) 
mean(mappingvalidation$morevalidation)*100
[1] 61.36931
tmp %>%  process_map(frequency("absolute"))

trace_explorer() with coverage argument n_traces = 10 shows the 10 most frequent in the event log.

tmp %>%    trace_explorer(n_traces =10, show_labels = FALSE, coverage_labels = c("relative"))

In the temporal process map, the value of nodes and edges represent the median duration in days of activities and waiting times.

tmp1 <- tmp
tmp1 %>%  process_map(performance(median, "days"))
tmp1 <- tmp
tmp1 %>%  process_map(performance(median, "mins"))
event_log_df[event_log_df$priority == "MEDIUM",] %>% activity_presence()
tmp <- event_log_df[event_log_df$priority == "MEDIUM",]  %>% filter_trace_frequency(percentage = 0.85)
totalmapping <- tmp[tmp$action == "LOCKED_FOR_MAPPING",] %>% group_by(taskId) %>% summarise(mapping_duration = sum(action_duration)) 
totalmapping
totalvalidation <- tmp[tmp$action == "LOCKED_FOR_VALIDATION",] %>% group_by(taskId) %>% summarise(validation_duration = sum(action_duration)) 
totalvalidation
mappingvalidation = merge(totalmapping, totalvalidation, by='taskId', all=TRUE)
mappingvalidation[is.na(mappingvalidation)] = 0
mappingvalidation
mappingvalidation <- transform(mappingvalidation, morevalidation= ifelse(mapping_duration < validation_duration, 1, 0)) 
mean(mappingvalidation$morevalidation)*100
[1] 57.85076
tmp %>%  process_map(frequency("absolute"))

trace_explorer() with coverage argument n_traces = 10 shows the 10 most frequent in the event log.

tmp %>%    trace_explorer(n_traces = 10, show_labels = FALSE, coverage_labels = c("relative"))

In the temporal process map, the value of nodes and edges represent the median duration in days of activities and waiting times.

tmp1 <- tmp
tmp1 %>%  process_map(performance(median, "days"))
tmp1 <- tmp
tmp1 %>%  process_map(performance(median, "mins"))
event_log_df[event_log_df$priority == "HIGH",] %>% activity_presence()
tmp <- event_log_df[event_log_df$priority == "HIGH",]  %>% filter_trace_frequency(percentage = 0.85)
totalmapping <- tmp[tmp$action == "LOCKED_FOR_MAPPING",] %>% group_by(taskId) %>% summarise(mapping_duration = sum(action_duration)) 
totalmapping
totalvalidation <- tmp[tmp$action == "LOCKED_FOR_VALIDATION",] %>% group_by(taskId) %>% summarise(validation_duration = sum(action_duration)) 
totalvalidation
mappingvalidation = merge(totalmapping, totalvalidation, by='taskId', all=TRUE)
mappingvalidation[is.na(mappingvalidation)] = 0
mappingvalidation
mappingvalidation <- transform(mappingvalidation, morevalidation= ifelse(mapping_duration < validation_duration, 1, 0)) 
mean(mappingvalidation$morevalidation)*100
[1] 50.39496
tmp %>%  process_map(frequency("absolute"))

trace_explorer() with coverage argument n_traces = 10 shows the 10 most frequent in the event log.

tmp %>%    trace_explorer(n_traces = 10, show_labels = FALSE, coverage_labels = c("relative"))

In the temporal process map, the value of nodes and edges represent the median duration in days of activities and waiting times.

tmp1 <- tmp
tmp1 %>%  process_map(performance(median, "days"))
tmp1 <- tmp
tmp1 %>%  process_map(performance(median, "mins"))
event_log_df[event_log_df$priority == "URGENT",] %>% activity_presence()
tmp <- event_log_df[event_log_df$priority == "URGENT",]  %>% filter_trace_frequency(percentage = 0.85)
totalmapping <- tmp[tmp$action == "LOCKED_FOR_MAPPING",] %>% group_by(taskId) %>% summarise(mapping_duration = sum(action_duration)) 
totalmapping
totalvalidation <- tmp[tmp$action == "LOCKED_FOR_VALIDATION",] %>% group_by(taskId) %>% summarise(validation_duration = sum(action_duration)) 
totalvalidation
mappingvalidation = merge(totalmapping, totalvalidation, by='taskId', all=TRUE)
mappingvalidation[is.na(mappingvalidation)] = 0
mappingvalidation
mappingvalidation <- transform(mappingvalidation, morevalidation= ifelse(mapping_duration < validation_duration, 1, 0)) 
mean(mappingvalidation$morevalidation)*100
[1] 27.51878
tmp %>%  process_map(frequency("absolute"))

trace_explorer() with coverage argument n_traces = 10 shows the 10 most frequent in the event log.

tmp %>%    trace_explorer(n_traces = 10, show_labels = FALSE, coverage_labels = c("relative"))

In the temporal process map, the value of nodes and edges represent the median duration in days of activities and waiting times.

tmp1 <- tmp
tmp1 %>%  process_map(performance(median, "days"))
tmp1 <- tmp
tmp1 %>%  process_map(performance(median, "mins"))

In the frequency process map, nodes represent the absolute number of activity instance executions and edges represent the absolute number of times source and target activities were executed directly following each other. To provide a clear process map, the event log was previously filter using filter_trace_frequency(). Setting percentage = 0.85 selects at least 85% of the cases, starting with those that have the highest frequency.

tmp <- event_log_df %>% filter_trace_frequency(percentage = 0.85)
tmp %>%  process_map(frequency("absolute"))

trace_explorer() with coverage argument n_traces = 10 shows the 10 most frequent in the event log.

event_log_df %>%    trace_explorer(n_traces = 10, show_labels = FALSE, coverage_labels = c("relative"))

In the temporal process map, the value of nodes and edges represent the median duration in days of activities and waiting times.

Organisation

Composition of the total number of contributors of the analysed projects according to their mapping level.

Breakdown of status execution frequency per mapping level.

LS0tDQp0aXRsZTogIlByb2Nlc3NfQW5hbHlzaXMiDQpvdXRwdXQ6DQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQotLS0NClRoaXMgaXMgUiBOb3RlYm9vayBwcmVzZW50IGEgcHJvY2VzcyBhbmFseXNpcyBvZiA3NDYgY29tcGxldGVkLCBmdWxseSB2YWxpZGF0ZWQsIGFuZCBhcmNoaXZlZCBwcm9qZWN0cyBpbiB0aGUgSE9UIFRhc2tpbmcgTWFuYWdlciAoSE9ULVRNKS4gUHJvY2VzcyBkaXNjb3Zlcnkgd2FzIHBlcmZvcm1lZCB1c2luZyBidXBhUiwgYSBzdWl0ZSBvZiBvcGVuLXNvdXJjZSBSIHBhY2thZ2VzIGZvciBidXNpbmVzcyBwcm9jZXNzIGRhdGEgYW5hbHlzaXMuDQpgYGB7cn0NCiMgSW1wb3J0IHJlcXVpcmVkIGxpYnJhcmllcw0Kc3VwcHJlc3NXYXJuaW5ncyh7DQpsaWJyYXJ5KGJ1cGF2ZXJzZSkNCmxpYnJhcnkocmVzaGFwZTIpDQpsaWJyYXJ5KGd0KQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkobWFncml0dHIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KEhtaXNjKQ0KbGlicmFyeShzdHJpbmdyKQ0KfSkNCmBgYA0KDQpSZWFkIGV2ZW50IGRhdGENClRoZSBmaWxlcyBjb250YWluaW5nIHByb2plY3QgaW5mbyAocHJvamVjdHMuY3N2KSBhbmQgcHJvamVjdCBzdGF0ZXMoZXZlbnRsb2cuY3N2KSBhcmUgcmVhZC4NCmBgYHtyfQ0KZXZlbnRfbG9nX2RmIDwtIHJlYWQuY3N2KCJzcGxpdHNfaW52YWxpZGF0aW9ucy5jc3YiLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UsIHNlcCA9ICIsIikNCnByb2plY3RzIDwtIHJlYWQuY3N2KCJwcm9qZWN0cy5jc3YiLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UsIHNlcCA9ICIsIikNCmV2ZW50X2xvZ19kZltjKCdwcm9qZWN0SWQnLCAndGFzaycpXSA8LSBzdHJfc3BsaXRfZml4ZWQoZXZlbnRfbG9nX2RmJHRhc2tJZCwgJ18nLCAyKQ0KcHJvamVjdHMkcHJvamVjdElkIDwtIGFzLmNoYXJhY3Rlcihwcm9qZWN0cyRwcm9qZWN0SWQpDQpldmVudF9sb2dfZGYgPSBtZXJnZSh4ID0gZXZlbnRfbG9nX2RmLCB5ID0gcHJvamVjdHNbLGMoInByb2plY3RJZCIsImRpZmZpY3VsdHkiLCJwcmlvcml0eSIpXSwgYnkgPSAicHJvamVjdElkIikNCmV2ZW50X2xvZ19kZiA8LSBldmVudF9sb2dfZGYgJT4lDQogIGNvbnZlcnRfdGltZXN0YW1wcyhjb2x1bW5zID0gYygic3RhcnQiLCAiY29tcGxldGUiKSwgZm9ybWF0ID0geW1kX2htcykgJT4lDQogIGFjdGl2aXR5bG9nKGNhc2VfaWQgPSAidGFza0lkIiwgYWN0aXZpdHlfaWQgPSAiYWN0aW9uIiwgcmVzb3VyY2VfaWQgPSAiYWN0aW9uQnkiLCB0aW1lc3RhbXBzID0gYygic3RhcnQiLCAiY29tcGxldGUiKSkNCmV2ZW50X2xvZ19kZiA8LSBldmVudF9sb2dfZGYgJT4lICBtdXRhdGUoYWN0aW9uX2R1cmF0aW9uID0gZGlmZnRpbWUoYXMuUE9TSVhjdChgY29tcGxldGVgKSwgYXMuUE9TSVhjdChgc3RhcnRgKSwgdW5pdHMgPSAibWlucyIpKQ0KYGBgDQoNClByb2plY3Qgc3RhdGVzDQpgYGB7cn0NCmhlYWQoZXZlbnRfbG9nX2RmKQ0KYGBgDQpQcm9qZWN0IGluZm8NCmBgYHtyfQ0KaGVhZChwcm9qZWN0cykNCmBgYA0KU3VtbWFyeSBvZiB0aGUgZXZlbnRsb2cgDQpgYGB7cn0NCnN1bW1hcnkoZXZlbnRfbG9nX2RmKQ0KYGBgDQoNCkFic29sdXRlIGZyZXF1ZW5jeSBvZiBzdGF0ZXMgaW4gdGhlIGV2ZW50bG9nLg0KYGBge3J9DQpldmVudF9sb2dfZGYgJT4lIGFjdGl2aXR5X2ZyZXF1ZW5jeSgiYWN0aXZpdHkiKQ0KYGBgDQoNCg0KQWN0aXZpdHkgcHJlc2VuY2Ugc2hvd3MgaW4gd2hhdCBwZXJjZW50YWdlIG9mIGNhc2VzIGFuIGFjdGl2aXR5IGlzIHByZXNlbnQuDQpgYGB7cn0NCmV2ZW50X2xvZ19kZiAlPiUgYWN0aXZpdHlfcHJlc2VuY2UoKQ0KYGBgDQpgYGB7cn0NCnRtcCA8LSBldmVudF9sb2dfZGYgICU+JSBmaWx0ZXJfdHJhY2VfZnJlcXVlbmN5KHBlcmNlbnRhZ2UgPSAwLjg1KQ0KYGBgDQoNCmBgYHtyfQ0KdG90YWxtYXBwaW5nIDwtIHRtcFt0bXAkYWN0aW9uID09ICJMT0NLRURfRk9SX01BUFBJTkciLF0gJT4lIGdyb3VwX2J5KHRhc2tJZCkgJT4lIHN1bW1hcmlzZShtYXBwaW5nX2R1cmF0aW9uID0gc3VtKGFjdGlvbl9kdXJhdGlvbikpIA0KdG90YWxtYXBwaW5nDQpgYGANCg0KDQoNCmBgYHtyfQ0KdG90YWx2YWxpZGF0aW9uIDwtIHRtcFt0bXAkYWN0aW9uID09ICJMT0NLRURfRk9SX1ZBTElEQVRJT04iLF0gJT4lIGdyb3VwX2J5KHRhc2tJZCkgJT4lIHN1bW1hcmlzZSh2YWxpZGF0aW9uX2R1cmF0aW9uID0gc3VtKGFjdGlvbl9kdXJhdGlvbikpIA0KdG90YWx2YWxpZGF0aW9uDQpgYGANCg0KYGBge3J9DQptYXBwaW5ndmFsaWRhdGlvbiA9IG1lcmdlKHRvdGFsbWFwcGluZywgdG90YWx2YWxpZGF0aW9uLCBieT0ndGFza0lkJywgYWxsPVRSVUUpDQptYXBwaW5ndmFsaWRhdGlvbltpcy5uYShtYXBwaW5ndmFsaWRhdGlvbildID0gMA0KbWFwcGluZ3ZhbGlkYXRpb24NCmBgYA0KDQoNCmBgYHtyfQ0KbWFwcGluZ3ZhbGlkYXRpb24gPC0gdHJhbnNmb3JtKG1hcHBpbmd2YWxpZGF0aW9uLCBtb3JldmFsaWRhdGlvbj0gaWZlbHNlKG1hcHBpbmdfZHVyYXRpb24gPCB2YWxpZGF0aW9uX2R1cmF0aW9uLCAxLCAwKSkgDQptZWFuKG1hcHBpbmd2YWxpZGF0aW9uJG1vcmV2YWxpZGF0aW9uKSoxMDANCmBgYA0KDQpgYGB7cn0NCnRtcCAlPiUgIHByb2Nlc3NfbWFwKGZyZXF1ZW5jeSgiYWJzb2x1dGUiKSkNCmBgYA0KDQp0cmFjZV9leHBsb3JlcigpIHdpdGggY292ZXJhZ2UgYXJndW1lbnQgbl90cmFjZXMgPSAxMCBzaG93cyB0aGUgMTAgbW9zdCBmcmVxdWVudCBpbiB0aGUgZXZlbnQgbG9nLg0KYGBge3J9DQpldmVudF9sb2dfZGYgJT4lICAgIHRyYWNlX2V4cGxvcmVyKG5fdHJhY2VzID0gMTAsIHNob3dfbGFiZWxzID0gRkFMU0UsIGNvdmVyYWdlX2xhYmVscyA9IGMoInJlbGF0aXZlIikpDQpgYGANCg0KSW4gdGhlIHRlbXBvcmFsIHByb2Nlc3MgbWFwLCB0aGUgdmFsdWUgb2Ygbm9kZXMgYW5kIGVkZ2VzIHJlcHJlc2VudCB0aGUgbWVkaWFuIGR1cmF0aW9uIGluIGRheXMgb2YgYWN0aXZpdGllcyBhbmQgd2FpdGluZyB0aW1lcy4NCmBgYHtyfQ0KdG1wMSA8LSB0bXANCnRtcDEgJT4lICBwcm9jZXNzX21hcChwZXJmb3JtYW5jZShtZWRpYW4sICJkYXlzIikpDQpgYGANCg0KYGBge3J9DQp0bXAxIDwtIHRtcA0KdG1wMSAlPiUgIHByb2Nlc3NfbWFwKHBlcmZvcm1hbmNlKG1lZGlhbiwgIm1pbnMiKSkNCmBgYCANCg0KYGBge3J9DQpldmVudF9sb2dfZGZbZXZlbnRfbG9nX2RmJGRpZmZpY3VsdHkgPT0gIkVBU1kiLF0gJT4lIGFjdGl2aXR5X3ByZXNlbmNlKCkNCmBgYA0KDQpgYGB7cn0NCnRtcCA8LSBldmVudF9sb2dfZGZbZXZlbnRfbG9nX2RmJGRpZmZpY3VsdHkgPT0gIkVBU1kiLF0gICU+JSBmaWx0ZXJfdHJhY2VfZnJlcXVlbmN5KHBlcmNlbnRhZ2UgPSAwLjg1KQ0KYGBgDQoNCmBgYHtyfQ0KdG90YWxtYXBwaW5nIDwtIHRtcFt0bXAkYWN0aW9uID09ICJMT0NLRURfRk9SX01BUFBJTkciLF0gJT4lIGdyb3VwX2J5KHRhc2tJZCkgJT4lIHN1bW1hcmlzZShtYXBwaW5nX2R1cmF0aW9uID0gc3VtKGFjdGlvbl9kdXJhdGlvbikpIA0KdG90YWxtYXBwaW5nDQpgYGANCg0KYGBge3J9DQp0b3RhbHZhbGlkYXRpb24gPC0gdG1wW3RtcCRhY3Rpb24gPT0gIkxPQ0tFRF9GT1JfVkFMSURBVElPTiIsXSAlPiUgZ3JvdXBfYnkodGFza0lkKSAlPiUgc3VtbWFyaXNlKHZhbGlkYXRpb25fZHVyYXRpb24gPSBzdW0oYWN0aW9uX2R1cmF0aW9uKSkgDQp0b3RhbHZhbGlkYXRpb24NCmBgYA0KDQpgYGB7cn0NCm1hcHBpbmd2YWxpZGF0aW9uID0gbWVyZ2UodG90YWxtYXBwaW5nLCB0b3RhbHZhbGlkYXRpb24sIGJ5PSd0YXNrSWQnLCBhbGw9VFJVRSkNCm1hcHBpbmd2YWxpZGF0aW9uW2lzLm5hKG1hcHBpbmd2YWxpZGF0aW9uKV0gPSAwDQptYXBwaW5ndmFsaWRhdGlvbg0KYGBgDQoNCmBgYHtyfQ0KbWFwcGluZ3ZhbGlkYXRpb24gPC0gdHJhbnNmb3JtKG1hcHBpbmd2YWxpZGF0aW9uLCBtb3JldmFsaWRhdGlvbj0gaWZlbHNlKG1hcHBpbmdfZHVyYXRpb24gPCB2YWxpZGF0aW9uX2R1cmF0aW9uLCAxLCAwKSkgDQptZWFuKG1hcHBpbmd2YWxpZGF0aW9uJG1vcmV2YWxpZGF0aW9uKSoxMDANCmBgYA0KDQpgYGB7cn0NCnRtcCAlPiUgIHByb2Nlc3NfbWFwKGZyZXF1ZW5jeSgiYWJzb2x1dGUiKSkNCmBgYA0KDQp0cmFjZV9leHBsb3JlcigpIHdpdGggY292ZXJhZ2UgYXJndW1lbnQgbl90cmFjZXMgPSAxMCBzaG93cyB0aGUgMTAgbW9zdCBmcmVxdWVudCBpbiB0aGUgZXZlbnQgbG9nLg0KYGBge3J9DQp0bXAgJT4lICAgIHRyYWNlX2V4cGxvcmVyKG5fdHJhY2VzID0gMTAsIHNob3dfbGFiZWxzID0gRkFMU0UsIGNvdmVyYWdlX2xhYmVscyA9IGMoInJlbGF0aXZlIikpDQpgYGANCg0KSW4gdGhlIHRlbXBvcmFsIHByb2Nlc3MgbWFwLCB0aGUgdmFsdWUgb2Ygbm9kZXMgYW5kIGVkZ2VzIHJlcHJlc2VudCB0aGUgbWVkaWFuIGR1cmF0aW9uIGluIGRheXMgb2YgYWN0aXZpdGllcyBhbmQgd2FpdGluZyB0aW1lcy4NCmBgYHtyfQ0KdG1wMSA8LSB0bXANCnRtcDEgJT4lICBwcm9jZXNzX21hcChwZXJmb3JtYW5jZShtZWRpYW4sICJkYXlzIikpDQpgYGANCg0KYGBge3J9DQp0bXAxIDwtIHRtcA0KdG1wMSAlPiUgIHByb2Nlc3NfbWFwKHBlcmZvcm1hbmNlKG1lZGlhbiwgIm1pbnMiKSkNCmBgYA0KDQpgYGB7cn0NCmV2ZW50X2xvZ19kZltldmVudF9sb2dfZGYkZGlmZmljdWx0eSA9PSAiTU9ERVJBVEUiLF0gJT4lIGFjdGl2aXR5X3ByZXNlbmNlKCkNCmBgYA0KDQpgYGB7cn0NCnRtcCA8LSBldmVudF9sb2dfZGZbZXZlbnRfbG9nX2RmJGRpZmZpY3VsdHkgPT0gIk1PREVSQVRFIixdICAlPiUgZmlsdGVyX3RyYWNlX2ZyZXF1ZW5jeShwZXJjZW50YWdlID0gMC44NSkNCmBgYA0KDQpgYGB7cn0NCnRvdGFsbWFwcGluZyA8LSB0bXBbdG1wJGFjdGlvbiA9PSAiTE9DS0VEX0ZPUl9NQVBQSU5HIixdICU+JSBncm91cF9ieSh0YXNrSWQpICU+JSBzdW1tYXJpc2UobWFwcGluZ19kdXJhdGlvbiA9IHN1bShhY3Rpb25fZHVyYXRpb24pKSANCnRvdGFsbWFwcGluZw0KYGBgDQoNCmBgYHtyfQ0KdG90YWx2YWxpZGF0aW9uIDwtIHRtcFt0bXAkYWN0aW9uID09ICJMT0NLRURfRk9SX1ZBTElEQVRJT04iLF0gJT4lIGdyb3VwX2J5KHRhc2tJZCkgJT4lIHN1bW1hcmlzZSh2YWxpZGF0aW9uX2R1cmF0aW9uID0gc3VtKGFjdGlvbl9kdXJhdGlvbikpIA0KdG90YWx2YWxpZGF0aW9uDQpgYGANCg0KYGBge3J9DQptYXBwaW5ndmFsaWRhdGlvbiA9IG1lcmdlKHRvdGFsbWFwcGluZywgdG90YWx2YWxpZGF0aW9uLCBieT0ndGFza0lkJywgYWxsPVRSVUUpDQptYXBwaW5ndmFsaWRhdGlvbltpcy5uYShtYXBwaW5ndmFsaWRhdGlvbildID0gMA0KbWFwcGluZ3ZhbGlkYXRpb24NCmBgYA0KDQpgYGB7cn0NCm1hcHBpbmd2YWxpZGF0aW9uIDwtIHRyYW5zZm9ybShtYXBwaW5ndmFsaWRhdGlvbiwgbW9yZXZhbGlkYXRpb249IGlmZWxzZShtYXBwaW5nX2R1cmF0aW9uIDwgdmFsaWRhdGlvbl9kdXJhdGlvbiwgMSwgMCkpIA0KbWVhbihtYXBwaW5ndmFsaWRhdGlvbiRtb3JldmFsaWRhdGlvbikqMTAwDQpgYGANCg0KYGBge3J9DQp0bXAgJT4lICBwcm9jZXNzX21hcChmcmVxdWVuY3koImFic29sdXRlIikpDQpgYGANCg0KdHJhY2VfZXhwbG9yZXIoKSB3aXRoIGNvdmVyYWdlIGFyZ3VtZW50IG5fdHJhY2VzID0gMTAgc2hvd3MgdGhlIDEwIG1vc3QgZnJlcXVlbnQgaW4gdGhlIGV2ZW50IGxvZy4NCmBgYHtyfQ0KdG1wICU+JSAgICB0cmFjZV9leHBsb3JlcihuX3RyYWNlcyA9IDEwLCBzaG93X2xhYmVscyA9IEZBTFNFLCBjb3ZlcmFnZV9sYWJlbHMgPSBjKCJyZWxhdGl2ZSIpKQ0KYGBgDQoNCkluIHRoZSB0ZW1wb3JhbCBwcm9jZXNzIG1hcCwgdGhlIHZhbHVlIG9mIG5vZGVzIGFuZCBlZGdlcyByZXByZXNlbnQgdGhlIG1lZGlhbiBkdXJhdGlvbiBpbiBkYXlzIG9mIGFjdGl2aXRpZXMgYW5kIHdhaXRpbmcgdGltZXMuDQpgYGB7cn0NCnRtcDEgPC0gdG1wDQp0bXAxICU+JSAgcHJvY2Vzc19tYXAocGVyZm9ybWFuY2UobWVkaWFuLCAiZGF5cyIpKQ0KYGBgDQoNCmBgYHtyfQ0KdG1wMSA8LSB0bXANCnRtcDEgJT4lICBwcm9jZXNzX21hcChwZXJmb3JtYW5jZShtZWRpYW4sICJtaW5zIikpDQpgYGANCg0KYGBge3J9DQpldmVudF9sb2dfZGZbZXZlbnRfbG9nX2RmJGRpZmZpY3VsdHkgPT0gIkNIQUxMRU5HSU5HIixdICU+JSBhY3Rpdml0eV9wcmVzZW5jZSgpDQpgYGANCg0KYGBge3J9DQp0bXAgPC0gZXZlbnRfbG9nX2RmW2V2ZW50X2xvZ19kZiRkaWZmaWN1bHR5ID09ICJDSEFMTEVOR0lORyIsXSAgJT4lIGZpbHRlcl90cmFjZV9mcmVxdWVuY3kocGVyY2VudGFnZSA9IDAuODUpDQpgYGANCg0KYGBge3J9DQp0b3RhbG1hcHBpbmcgPC0gdG1wW3RtcCRhY3Rpb24gPT0gIkxPQ0tFRF9GT1JfTUFQUElORyIsXSAlPiUgZ3JvdXBfYnkodGFza0lkKSAlPiUgc3VtbWFyaXNlKG1hcHBpbmdfZHVyYXRpb24gPSBzdW0oYWN0aW9uX2R1cmF0aW9uKSkgDQp0b3RhbG1hcHBpbmcNCmBgYA0KDQpgYGB7cn0NCnRvdGFsdmFsaWRhdGlvbiA8LSB0bXBbdG1wJGFjdGlvbiA9PSAiTE9DS0VEX0ZPUl9WQUxJREFUSU9OIixdICU+JSBncm91cF9ieSh0YXNrSWQpICU+JSBzdW1tYXJpc2UodmFsaWRhdGlvbl9kdXJhdGlvbiA9IHN1bShhY3Rpb25fZHVyYXRpb24pKSANCnRvdGFsdmFsaWRhdGlvbg0KYGBgDQoNCmBgYHtyfQ0KbWFwcGluZ3ZhbGlkYXRpb24gPSBtZXJnZSh0b3RhbG1hcHBpbmcsIHRvdGFsdmFsaWRhdGlvbiwgYnk9J3Rhc2tJZCcsIGFsbD1UUlVFKQ0KbWFwcGluZ3ZhbGlkYXRpb25baXMubmEobWFwcGluZ3ZhbGlkYXRpb24pXSA9IDANCm1hcHBpbmd2YWxpZGF0aW9uDQpgYGANCg0KYGBge3J9DQptYXBwaW5ndmFsaWRhdGlvbiA8LSB0cmFuc2Zvcm0obWFwcGluZ3ZhbGlkYXRpb24sIG1vcmV2YWxpZGF0aW9uPSBpZmVsc2UobWFwcGluZ19kdXJhdGlvbiA8IHZhbGlkYXRpb25fZHVyYXRpb24sIDEsIDApKSANCm1lYW4obWFwcGluZ3ZhbGlkYXRpb24kbW9yZXZhbGlkYXRpb24pKjEwMA0KYGBgDQoNCmBgYHtyfQ0KdG1wICU+JSAgcHJvY2Vzc19tYXAoZnJlcXVlbmN5KCJhYnNvbHV0ZSIpKQ0KYGBgDQoNCnRyYWNlX2V4cGxvcmVyKCkgd2l0aCBjb3ZlcmFnZSBhcmd1bWVudCBuX3RyYWNlcyA9IDEwIHNob3dzIHRoZSAxMCBtb3N0IGZyZXF1ZW50IGluIHRoZSBldmVudCBsb2cuDQpgYGB7cn0NCnRtcCAlPiUgICAgdHJhY2VfZXhwbG9yZXIobl90cmFjZXMgPSAxMCwgc2hvd19sYWJlbHMgPSBGQUxTRSwgY292ZXJhZ2VfbGFiZWxzID0gYygicmVsYXRpdmUiKSkNCmBgYA0KDQpJbiB0aGUgdGVtcG9yYWwgcHJvY2VzcyBtYXAsIHRoZSB2YWx1ZSBvZiBub2RlcyBhbmQgZWRnZXMgcmVwcmVzZW50IHRoZSBtZWRpYW4gZHVyYXRpb24gaW4gZGF5cyBvZiBhY3Rpdml0aWVzIGFuZCB3YWl0aW5nIHRpbWVzLg0KYGBge3J9DQp0bXAxIDwtIHRtcA0KdG1wMSAlPiUgIHByb2Nlc3NfbWFwKHBlcmZvcm1hbmNlKG1lZGlhbiwgImRheXMiKSkNCmBgYA0KDQpgYGB7cn0NCnRtcDEgPC0gdG1wDQp0bXAxICU+JSAgcHJvY2Vzc19tYXAocGVyZm9ybWFuY2UobWVkaWFuLCAibWlucyIpKQ0KYGBgDQoNCmBgYHtyfQ0KZXZlbnRfbG9nX2RmW2V2ZW50X2xvZ19kZiRwcmlvcml0eSA9PSAiTE9XIixdICU+JSBhY3Rpdml0eV9wcmVzZW5jZSgpDQpgYGANCg0KYGBge3J9DQp0bXAgPC0gZXZlbnRfbG9nX2RmW2V2ZW50X2xvZ19kZiRwcmlvcml0eSA9PSAiTE9XIixdICAlPiUgZmlsdGVyX3RyYWNlX2ZyZXF1ZW5jeShwZXJjZW50YWdlID0gMC44NSkNCmBgYA0KDQpgYGB7cn0NCnRvdGFsbWFwcGluZyA8LSB0bXBbdG1wJGFjdGlvbiA9PSAiTE9DS0VEX0ZPUl9NQVBQSU5HIixdICU+JSBncm91cF9ieSh0YXNrSWQpICU+JSBzdW1tYXJpc2UobWFwcGluZ19kdXJhdGlvbiA9IHN1bShhY3Rpb25fZHVyYXRpb24pKSANCnRvdGFsbWFwcGluZw0KYGBgDQoNCmBgYHtyfQ0KdG90YWx2YWxpZGF0aW9uIDwtIHRtcFt0bXAkYWN0aW9uID09ICJMT0NLRURfRk9SX1ZBTElEQVRJT04iLF0gJT4lIGdyb3VwX2J5KHRhc2tJZCkgJT4lIHN1bW1hcmlzZSh2YWxpZGF0aW9uX2R1cmF0aW9uID0gc3VtKGFjdGlvbl9kdXJhdGlvbikpIA0KdG90YWx2YWxpZGF0aW9uDQpgYGANCg0KYGBge3J9DQptYXBwaW5ndmFsaWRhdGlvbiA9IG1lcmdlKHRvdGFsbWFwcGluZywgdG90YWx2YWxpZGF0aW9uLCBieT0ndGFza0lkJywgYWxsPVRSVUUpDQptYXBwaW5ndmFsaWRhdGlvbltpcy5uYShtYXBwaW5ndmFsaWRhdGlvbildID0gMA0KbWFwcGluZ3ZhbGlkYXRpb24NCmBgYA0KDQpgYGB7cn0NCm1hcHBpbmd2YWxpZGF0aW9uIDwtIHRyYW5zZm9ybShtYXBwaW5ndmFsaWRhdGlvbiwgbW9yZXZhbGlkYXRpb249IGlmZWxzZShtYXBwaW5nX2R1cmF0aW9uIDwgdmFsaWRhdGlvbl9kdXJhdGlvbiwgMSwgMCkpIA0KbWVhbihtYXBwaW5ndmFsaWRhdGlvbiRtb3JldmFsaWRhdGlvbikqMTAwDQpgYGANCg0KYGBge3J9DQp0bXAgJT4lICBwcm9jZXNzX21hcChmcmVxdWVuY3koImFic29sdXRlIikpDQpgYGANCg0KdHJhY2VfZXhwbG9yZXIoKSB3aXRoIGNvdmVyYWdlIGFyZ3VtZW50IG5fdHJhY2VzID0gMTAgc2hvd3MgdGhlIDEwIG1vc3QgZnJlcXVlbnQgaW4gdGhlIGV2ZW50IGxvZy4NCmBgYHtyfQ0KdG1wICU+JSAgICB0cmFjZV9leHBsb3JlcihuX3RyYWNlcyA9MTAsIHNob3dfbGFiZWxzID0gRkFMU0UsIGNvdmVyYWdlX2xhYmVscyA9IGMoInJlbGF0aXZlIikpDQpgYGANCg0KSW4gdGhlIHRlbXBvcmFsIHByb2Nlc3MgbWFwLCB0aGUgdmFsdWUgb2Ygbm9kZXMgYW5kIGVkZ2VzIHJlcHJlc2VudCB0aGUgbWVkaWFuIGR1cmF0aW9uIGluIGRheXMgb2YgYWN0aXZpdGllcyBhbmQgd2FpdGluZyB0aW1lcy4NCmBgYHtyfQ0KdG1wMSA8LSB0bXANCnRtcDEgJT4lICBwcm9jZXNzX21hcChwZXJmb3JtYW5jZShtZWRpYW4sICJkYXlzIikpDQpgYGANCg0KYGBge3J9DQp0bXAxIDwtIHRtcA0KdG1wMSAlPiUgIHByb2Nlc3NfbWFwKHBlcmZvcm1hbmNlKG1lZGlhbiwgIm1pbnMiKSkNCmBgYA0KDQpgYGB7cn0NCmV2ZW50X2xvZ19kZltldmVudF9sb2dfZGYkcHJpb3JpdHkgPT0gIk1FRElVTSIsXSAlPiUgYWN0aXZpdHlfcHJlc2VuY2UoKQ0KYGBgDQoNCmBgYHtyfQ0KdG1wIDwtIGV2ZW50X2xvZ19kZltldmVudF9sb2dfZGYkcHJpb3JpdHkgPT0gIk1FRElVTSIsXSAgJT4lIGZpbHRlcl90cmFjZV9mcmVxdWVuY3kocGVyY2VudGFnZSA9IDAuODUpDQpgYGANCg0KYGBge3J9DQp0b3RhbG1hcHBpbmcgPC0gdG1wW3RtcCRhY3Rpb24gPT0gIkxPQ0tFRF9GT1JfTUFQUElORyIsXSAlPiUgZ3JvdXBfYnkodGFza0lkKSAlPiUgc3VtbWFyaXNlKG1hcHBpbmdfZHVyYXRpb24gPSBzdW0oYWN0aW9uX2R1cmF0aW9uKSkgDQp0b3RhbG1hcHBpbmcNCmBgYA0KDQpgYGB7cn0NCnRvdGFsdmFsaWRhdGlvbiA8LSB0bXBbdG1wJGFjdGlvbiA9PSAiTE9DS0VEX0ZPUl9WQUxJREFUSU9OIixdICU+JSBncm91cF9ieSh0YXNrSWQpICU+JSBzdW1tYXJpc2UodmFsaWRhdGlvbl9kdXJhdGlvbiA9IHN1bShhY3Rpb25fZHVyYXRpb24pKSANCnRvdGFsdmFsaWRhdGlvbg0KYGBgDQoNCmBgYHtyfQ0KbWFwcGluZ3ZhbGlkYXRpb24gPSBtZXJnZSh0b3RhbG1hcHBpbmcsIHRvdGFsdmFsaWRhdGlvbiwgYnk9J3Rhc2tJZCcsIGFsbD1UUlVFKQ0KbWFwcGluZ3ZhbGlkYXRpb25baXMubmEobWFwcGluZ3ZhbGlkYXRpb24pXSA9IDANCm1hcHBpbmd2YWxpZGF0aW9uDQpgYGANCg0KYGBge3J9DQptYXBwaW5ndmFsaWRhdGlvbiA8LSB0cmFuc2Zvcm0obWFwcGluZ3ZhbGlkYXRpb24sIG1vcmV2YWxpZGF0aW9uPSBpZmVsc2UobWFwcGluZ19kdXJhdGlvbiA8IHZhbGlkYXRpb25fZHVyYXRpb24sIDEsIDApKSANCm1lYW4obWFwcGluZ3ZhbGlkYXRpb24kbW9yZXZhbGlkYXRpb24pKjEwMA0KYGBgDQoNCmBgYHtyfQ0KdG1wICU+JSAgcHJvY2Vzc19tYXAoZnJlcXVlbmN5KCJhYnNvbHV0ZSIpKQ0KYGBgDQoNCnRyYWNlX2V4cGxvcmVyKCkgd2l0aCBjb3ZlcmFnZSBhcmd1bWVudCBuX3RyYWNlcyA9IDEwIHNob3dzIHRoZSAxMCBtb3N0IGZyZXF1ZW50IGluIHRoZSBldmVudCBsb2cuDQpgYGB7cn0NCnRtcCAlPiUgICAgdHJhY2VfZXhwbG9yZXIobl90cmFjZXMgPSAxMCwgc2hvd19sYWJlbHMgPSBGQUxTRSwgY292ZXJhZ2VfbGFiZWxzID0gYygicmVsYXRpdmUiKSkNCmBgYA0KDQpJbiB0aGUgdGVtcG9yYWwgcHJvY2VzcyBtYXAsIHRoZSB2YWx1ZSBvZiBub2RlcyBhbmQgZWRnZXMgcmVwcmVzZW50IHRoZSBtZWRpYW4gZHVyYXRpb24gaW4gZGF5cyBvZiBhY3Rpdml0aWVzIGFuZCB3YWl0aW5nIHRpbWVzLg0KYGBge3J9DQp0bXAxIDwtIHRtcA0KdG1wMSAlPiUgIHByb2Nlc3NfbWFwKHBlcmZvcm1hbmNlKG1lZGlhbiwgImRheXMiKSkNCmBgYA0KDQpgYGB7cn0NCnRtcDEgPC0gdG1wDQp0bXAxICU+JSAgcHJvY2Vzc19tYXAocGVyZm9ybWFuY2UobWVkaWFuLCAibWlucyIpKQ0KYGBgDQoNCmBgYHtyfQ0KZXZlbnRfbG9nX2RmW2V2ZW50X2xvZ19kZiRwcmlvcml0eSA9PSAiSElHSCIsXSAlPiUgYWN0aXZpdHlfcHJlc2VuY2UoKQ0KYGBgDQoNCmBgYHtyfQ0KdG1wIDwtIGV2ZW50X2xvZ19kZltldmVudF9sb2dfZGYkcHJpb3JpdHkgPT0gIkhJR0giLF0gICU+JSBmaWx0ZXJfdHJhY2VfZnJlcXVlbmN5KHBlcmNlbnRhZ2UgPSAwLjg1KQ0KYGBgDQoNCmBgYHtyfQ0KdG90YWxtYXBwaW5nIDwtIHRtcFt0bXAkYWN0aW9uID09ICJMT0NLRURfRk9SX01BUFBJTkciLF0gJT4lIGdyb3VwX2J5KHRhc2tJZCkgJT4lIHN1bW1hcmlzZShtYXBwaW5nX2R1cmF0aW9uID0gc3VtKGFjdGlvbl9kdXJhdGlvbikpIA0KdG90YWxtYXBwaW5nDQpgYGANCg0KYGBge3J9DQp0b3RhbHZhbGlkYXRpb24gPC0gdG1wW3RtcCRhY3Rpb24gPT0gIkxPQ0tFRF9GT1JfVkFMSURBVElPTiIsXSAlPiUgZ3JvdXBfYnkodGFza0lkKSAlPiUgc3VtbWFyaXNlKHZhbGlkYXRpb25fZHVyYXRpb24gPSBzdW0oYWN0aW9uX2R1cmF0aW9uKSkgDQp0b3RhbHZhbGlkYXRpb24NCmBgYA0KDQpgYGB7cn0NCm1hcHBpbmd2YWxpZGF0aW9uID0gbWVyZ2UodG90YWxtYXBwaW5nLCB0b3RhbHZhbGlkYXRpb24sIGJ5PSd0YXNrSWQnLCBhbGw9VFJVRSkNCm1hcHBpbmd2YWxpZGF0aW9uW2lzLm5hKG1hcHBpbmd2YWxpZGF0aW9uKV0gPSAwDQptYXBwaW5ndmFsaWRhdGlvbg0KYGBgDQoNCmBgYHtyfQ0KbWFwcGluZ3ZhbGlkYXRpb24gPC0gdHJhbnNmb3JtKG1hcHBpbmd2YWxpZGF0aW9uLCBtb3JldmFsaWRhdGlvbj0gaWZlbHNlKG1hcHBpbmdfZHVyYXRpb24gPCB2YWxpZGF0aW9uX2R1cmF0aW9uLCAxLCAwKSkgDQptZWFuKG1hcHBpbmd2YWxpZGF0aW9uJG1vcmV2YWxpZGF0aW9uKSoxMDANCmBgYA0KDQpgYGB7cn0NCnRtcCAlPiUgIHByb2Nlc3NfbWFwKGZyZXF1ZW5jeSgiYWJzb2x1dGUiKSkNCmBgYA0KDQp0cmFjZV9leHBsb3JlcigpIHdpdGggY292ZXJhZ2UgYXJndW1lbnQgbl90cmFjZXMgPSAxMCBzaG93cyB0aGUgMTAgbW9zdCBmcmVxdWVudCBpbiB0aGUgZXZlbnQgbG9nLg0KYGBge3J9DQp0bXAgJT4lICAgIHRyYWNlX2V4cGxvcmVyKG5fdHJhY2VzID0gMTAsIHNob3dfbGFiZWxzID0gRkFMU0UsIGNvdmVyYWdlX2xhYmVscyA9IGMoInJlbGF0aXZlIikpDQpgYGANCg0KSW4gdGhlIHRlbXBvcmFsIHByb2Nlc3MgbWFwLCB0aGUgdmFsdWUgb2Ygbm9kZXMgYW5kIGVkZ2VzIHJlcHJlc2VudCB0aGUgbWVkaWFuIGR1cmF0aW9uIGluIGRheXMgb2YgYWN0aXZpdGllcyBhbmQgd2FpdGluZyB0aW1lcy4NCmBgYHtyfQ0KdG1wMSA8LSB0bXANCnRtcDEgJT4lICBwcm9jZXNzX21hcChwZXJmb3JtYW5jZShtZWRpYW4sICJkYXlzIikpDQpgYGANCg0KYGBge3J9DQp0bXAxIDwtIHRtcA0KdG1wMSAlPiUgIHByb2Nlc3NfbWFwKHBlcmZvcm1hbmNlKG1lZGlhbiwgIm1pbnMiKSkNCmBgYA0KDQpgYGB7cn0NCmV2ZW50X2xvZ19kZltldmVudF9sb2dfZGYkcHJpb3JpdHkgPT0gIlVSR0VOVCIsXSAlPiUgYWN0aXZpdHlfcHJlc2VuY2UoKQ0KYGBgDQoNCmBgYHtyfQ0KdG1wIDwtIGV2ZW50X2xvZ19kZltldmVudF9sb2dfZGYkcHJpb3JpdHkgPT0gIlVSR0VOVCIsXSAgJT4lIGZpbHRlcl90cmFjZV9mcmVxdWVuY3kocGVyY2VudGFnZSA9IDAuODUpDQpgYGANCg0KYGBge3J9DQp0b3RhbG1hcHBpbmcgPC0gdG1wW3RtcCRhY3Rpb24gPT0gIkxPQ0tFRF9GT1JfTUFQUElORyIsXSAlPiUgZ3JvdXBfYnkodGFza0lkKSAlPiUgc3VtbWFyaXNlKG1hcHBpbmdfZHVyYXRpb24gPSBzdW0oYWN0aW9uX2R1cmF0aW9uKSkgDQp0b3RhbG1hcHBpbmcNCmBgYA0KDQpgYGB7cn0NCnRvdGFsdmFsaWRhdGlvbiA8LSB0bXBbdG1wJGFjdGlvbiA9PSAiTE9DS0VEX0ZPUl9WQUxJREFUSU9OIixdICU+JSBncm91cF9ieSh0YXNrSWQpICU+JSBzdW1tYXJpc2UodmFsaWRhdGlvbl9kdXJhdGlvbiA9IHN1bShhY3Rpb25fZHVyYXRpb24pKSANCnRvdGFsdmFsaWRhdGlvbg0KYGBgDQoNCmBgYHtyfQ0KbWFwcGluZ3ZhbGlkYXRpb24gPSBtZXJnZSh0b3RhbG1hcHBpbmcsIHRvdGFsdmFsaWRhdGlvbiwgYnk9J3Rhc2tJZCcsIGFsbD1UUlVFKQ0KbWFwcGluZ3ZhbGlkYXRpb25baXMubmEobWFwcGluZ3ZhbGlkYXRpb24pXSA9IDANCm1hcHBpbmd2YWxpZGF0aW9uDQpgYGANCg0KYGBge3J9DQptYXBwaW5ndmFsaWRhdGlvbiA8LSB0cmFuc2Zvcm0obWFwcGluZ3ZhbGlkYXRpb24sIG1vcmV2YWxpZGF0aW9uPSBpZmVsc2UobWFwcGluZ19kdXJhdGlvbiA8IHZhbGlkYXRpb25fZHVyYXRpb24sIDEsIDApKSANCm1lYW4obWFwcGluZ3ZhbGlkYXRpb24kbW9yZXZhbGlkYXRpb24pKjEwMA0KYGBgDQoNCmBgYHtyfQ0KdG1wICU+JSAgcHJvY2Vzc19tYXAoZnJlcXVlbmN5KCJhYnNvbHV0ZSIpKQ0KYGBgDQoNCnRyYWNlX2V4cGxvcmVyKCkgd2l0aCBjb3ZlcmFnZSBhcmd1bWVudCBuX3RyYWNlcyA9IDEwIHNob3dzIHRoZSAxMCBtb3N0IGZyZXF1ZW50IGluIHRoZSBldmVudCBsb2cuDQpgYGB7cn0NCnRtcCAlPiUgICAgdHJhY2VfZXhwbG9yZXIobl90cmFjZXMgPSAxMCwgc2hvd19sYWJlbHMgPSBGQUxTRSwgY292ZXJhZ2VfbGFiZWxzID0gYygicmVsYXRpdmUiKSkNCmBgYA0KDQpJbiB0aGUgdGVtcG9yYWwgcHJvY2VzcyBtYXAsIHRoZSB2YWx1ZSBvZiBub2RlcyBhbmQgZWRnZXMgcmVwcmVzZW50IHRoZSBtZWRpYW4gZHVyYXRpb24gaW4gZGF5cyBvZiBhY3Rpdml0aWVzIGFuZCB3YWl0aW5nIHRpbWVzLg0KYGBge3J9DQp0bXAxIDwtIHRtcA0KdG1wMSAlPiUgIHByb2Nlc3NfbWFwKHBlcmZvcm1hbmNlKG1lZGlhbiwgImRheXMiKSkNCmBgYA0KDQpgYGB7cn0NCnRtcDEgPC0gdG1wDQp0bXAxICU+JSAgcHJvY2Vzc19tYXAocGVyZm9ybWFuY2UobWVkaWFuLCAibWlucyIpKQ0KYGBgDQoNCkluIHRoZSBmcmVxdWVuY3kgcHJvY2VzcyBtYXAsIG5vZGVzIHJlcHJlc2VudCB0aGUgYWJzb2x1dGUgbnVtYmVyIG9mIGFjdGl2aXR5IGluc3RhbmNlIGV4ZWN1dGlvbnMgYW5kIGVkZ2VzIHJlcHJlc2VudCB0aGUgYWJzb2x1dGUgbnVtYmVyIG9mIHRpbWVzIHNvdXJjZSBhbmQgdGFyZ2V0IGFjdGl2aXRpZXMgd2VyZSBleGVjdXRlZCBkaXJlY3RseSBmb2xsb3dpbmcgZWFjaCBvdGhlci4gVG8gcHJvdmlkZSBhIGNsZWFyIHByb2Nlc3MgbWFwLCB0aGUgZXZlbnQgbG9nIHdhcyBwcmV2aW91c2x5IGZpbHRlciB1c2luZyBmaWx0ZXJfdHJhY2VfZnJlcXVlbmN5KCkuIFNldHRpbmcgcGVyY2VudGFnZSA9IDAuODUgc2VsZWN0cyBhdCBsZWFzdCA4NSUgb2YgdGhlIGNhc2VzLCBzdGFydGluZyB3aXRoIHRob3NlIHRoYXQgaGF2ZSB0aGUgaGlnaGVzdCBmcmVxdWVuY3kuDQpgYGB7cn0NCnRtcCA8LSBldmVudF9sb2dfZGYgJT4lIGZpbHRlcl90cmFjZV9mcmVxdWVuY3kocGVyY2VudGFnZSA9IDAuODUpDQp0bXAgJT4lICBwcm9jZXNzX21hcChmcmVxdWVuY3koImFic29sdXRlIikpDQpgYGANCg0KdHJhY2VfZXhwbG9yZXIoKSB3aXRoIGNvdmVyYWdlIGFyZ3VtZW50IG5fdHJhY2VzID0gMTAgc2hvd3MgdGhlIDEwIG1vc3QgZnJlcXVlbnQgaW4gdGhlIGV2ZW50IGxvZy4NCmBgYHtyfQ0KZXZlbnRfbG9nX2RmICU+JSAgICB0cmFjZV9leHBsb3JlcihuX3RyYWNlcyA9IDEwLCBzaG93X2xhYmVscyA9IEZBTFNFLCBjb3ZlcmFnZV9sYWJlbHMgPSBjKCJyZWxhdGl2ZSIpKQ0KYGBgDQoNCkluIHRoZSB0ZW1wb3JhbCBwcm9jZXNzIG1hcCwgdGhlIHZhbHVlIG9mIG5vZGVzIGFuZCBlZGdlcyByZXByZXNlbnQgdGhlIG1lZGlhbiBkdXJhdGlvbiBpbiBkYXlzIG9mIGFjdGl2aXRpZXMgYW5kIHdhaXRpbmcgdGltZXMuDQpgYGB7cn0NCnRtcDEgPC0gdG1wDQp0bXAxICU+JSAgcHJvY2Vzc19tYXAocGVyZm9ybWFuY2UobWVkaWFuLCAiZGF5cyIpKQ0KYGBgDQoNCmBgYHtyfQ0KdG1wMSA8LSB0bXANCnRtcDEgJT4lICBwcm9jZXNzX21hcChwZXJmb3JtYW5jZShtZWRpYW4sICJtaW5zIikpDQpgYGANCg0KIyBPcmdhbmlzYXRpb24geyNvcmdhbmlzYXRpb259DQpDb21wb3NpdGlvbiBvZiB0aGUgdG90YWwgbnVtYmVyIG9mIGNvbnRyaWJ1dG9ycyBvZiB0aGUgYW5hbHlzZWQgcHJvamVjdHMgYWNjb3JkaW5nIHRvIHRoZWlyIG1hcHBpbmcgbGV2ZWwuDQoNCmBgYHtyfQ0KbWFwcGluZ0xldmVsIDwtIGV2ZW50X2xvZ19kZiAlPiUgIGdyb3VwX2J5KG1hcHBpbmdMZXZlbCkgJT4lIHN1bW1hcmlzZShjb3VudCA9IG5fZGlzdGluY3QoYWN0aW9uQnkpKQ0KbWFwcGluZ0xldmVsJHBlcmNlbnRhZ2UgPC0gcm91bmQobWFwcGluZ0xldmVsJGNvdW50L3N1bShtYXBwaW5nTGV2ZWwkY291bnQpKjEwMCwxKQ0KbWFwcGluZ0xldmVsDQpgYGANCg0KQnJlYWtkb3duIG9mIHN0YXR1cyBleGVjdXRpb24gZnJlcXVlbmN5IHBlciBtYXBwaW5nIGxldmVsLg0KDQpgYGB7cn0NCmRhdGFfcGl2b3QgPC0gZGNhc3QoZXZlbnRfbG9nX2RmLCBhY3Rpb24gfiBtYXBwaW5nTGV2ZWwsdmFsdWUudmFyID0gInRhc2tJZCIsIGxlbmd0aCkNCmRhdGFfcGl2b3Qkc3VtIDwtICBkYXRhX3Bpdm90JEFEVkFOQ0VEICsgZGF0YV9waXZvdCRCRUdJTk5FUiArIGRhdGFfcGl2b3QkSU5URVJNRURJQVRFDQpkYXRhX3Bpdm90JEFEVkFOQ0VEcGVyIDwtIHJvdW5kKGRhdGFfcGl2b3QkQURWQU5DRUQvZGF0YV9waXZvdCRzdW0qMTAwLDEpDQpkYXRhX3Bpdm90JEJFR0lOTkVScGVyIDwtIHJvdW5kKGRhdGFfcGl2b3QkQkVHSU5ORVIvZGF0YV9waXZvdCRzdW0qMTAwLDEpDQpkYXRhX3Bpdm90JElOVEVSTUVESUFURXBlciA8LSByb3VuZChkYXRhX3Bpdm90JElOVEVSTUVESUFURS9kYXRhX3Bpdm90JHN1bSoxMDAsMSkNCmRhdGFfcGl2b3RbYygiYWN0aW9uIiwiQURWQU5DRURwZXIiLCJCRUdJTk5FUnBlciIsIklOVEVSTUVESUFURXBlciIpXSAlPiUgZ3QoKSAlPiUgIGRhdGFfY29sb3IoY29sdW1ucyA9IDI6NCwgY29sb3JzID0gY29sX251bWVyaWMocGFsZXR0ZSA9IGMoIndoaXRlIiwiZGFya2dyZWVuIiksZG9tYWluID0gYygwLDEwMCkpKQ0KYGBgDQoNCmBgYHtyfQ0KZGF0YV9waXZvdCA8LSBkY2FzdChldmVudF9sb2dfZGZbZXZlbnRfbG9nX2RmJGFjdGlvbiAlaW4lIGMoJ0xPQ0tFRF9GT1JfTUFQUElORycsJ01BUFBFRCcsJ0FVVE9fVU5MT0NLRURfRk9SX01BUFBJTkcnLCdTUExJVCcsJ0JBRElNQUdFUlknKSxdLCBwcm9qZWN0SWQgfiBtYXBwaW5nTGV2ZWwsdmFsdWUudmFyID0gInVzZXJuYW1lIiwgZnVuLmFnZ3JlZ2F0ZSA9IHVuaXF1ZU4pDQpzdW0oZGF0YV9waXZvdCRCRUdJTk5FUikvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpLyhzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkrc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKStzdW0oZGF0YV9waXZvdCRCRUdJTk5FUikpKjEwMA0Kc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpLyhzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkrc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKStzdW0oZGF0YV9waXZvdCRCRUdJTk5FUikpKjEwMA0KYGBgDQoNCmBgYHtyfQ0KZGF0YV9waXZvdCA8LSBkY2FzdChldmVudF9sb2dfZGZbZXZlbnRfbG9nX2RmJGFjdGlvbiAlaW4lIGMoJ0xPQ0tFRF9GT1JfVkFMSURBVElPTicsJ0lOVkFMSURBVEVEJywnVkFMSURBVEVEJywnQVVUT19VTkxPQ0tFRF9GT1JfVkFMSURBVElPTicpLF0sIHByb2plY3RJZCB+IG1hcHBpbmdMZXZlbCx2YWx1ZS52YXIgPSAidXNlcm5hbWUiLCBmdW4uYWdncmVnYXRlID0gdW5pcXVlTikNCnN1bShkYXRhX3Bpdm90JEJFR0lOTkVSKS8oc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpK3N1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkrc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpKSoxMDANCnN1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpgYGANCg0KYGBge3J9DQpkYXRhX3Bpdm90IDwtIGRjYXN0KGV2ZW50X2xvZ19kZltldmVudF9sb2dfZGYkZGlmZmljdWx0eSA9PSAiRUFTWSIsXSwgYWN0aW9uIH4gbWFwcGluZ0xldmVsLHZhbHVlLnZhciA9ICJ0YXNrSWQiLCBsZW5ndGgpDQpkYXRhX3Bpdm90JHN1bSA8LSAgZGF0YV9waXZvdCRBRFZBTkNFRCArIGRhdGFfcGl2b3QkQkVHSU5ORVIgKyBkYXRhX3Bpdm90JElOVEVSTUVESUFURQ0KZGF0YV9waXZvdCRBRFZBTkNFRHBlciA8LSByb3VuZChkYXRhX3Bpdm90JEFEVkFOQ0VEL2RhdGFfcGl2b3Qkc3VtKjEwMCwxKQ0KZGF0YV9waXZvdCRCRUdJTk5FUnBlciA8LSByb3VuZChkYXRhX3Bpdm90JEJFR0lOTkVSL2RhdGFfcGl2b3Qkc3VtKjEwMCwxKQ0KZGF0YV9waXZvdCRJTlRFUk1FRElBVEVwZXIgPC0gcm91bmQoZGF0YV9waXZvdCRJTlRFUk1FRElBVEUvZGF0YV9waXZvdCRzdW0qMTAwLDEpDQpkYXRhX3Bpdm90W2MoImFjdGlvbiIsIkFEVkFOQ0VEcGVyIiwiQkVHSU5ORVJwZXIiLCJJTlRFUk1FRElBVEVwZXIiKV0gJT4lIGd0KCkgJT4lICBkYXRhX2NvbG9yKGNvbHVtbnMgPSAyOjQsIGNvbG9ycyA9IGNvbF9udW1lcmljKHBhbGV0dGUgPSBjKCJ3aGl0ZSIsImRhcmtncmVlbiIpLGRvbWFpbiA9IGMoMCwxMDApKSkNCmBgYA0KDQpgYGB7cn0NCmVhc3kgPC0gZXZlbnRfbG9nX2RmW2V2ZW50X2xvZ19kZiRkaWZmaWN1bHR5ID09ICJFQVNZIixdDQpkYXRhX3Bpdm90IDwtIGRjYXN0KGVhc3lbZWFzeSRhY3Rpb24gJWluJSBjKCdMT0NLRURfRk9SX01BUFBJTkcnLCdNQVBQRUQnLCdBVVRPX1VOTE9DS0VEX0ZPUl9NQVBQSU5HJywnU1BMSVQnLCdCQURJTUFHRVJZJyksXSwgcHJvamVjdElkIH4gbWFwcGluZ0xldmVsLHZhbHVlLnZhciA9ICJ1c2VybmFtZSIsIGZ1bi5hZ2dyZWdhdGUgPSB1bmlxdWVOKQ0Kc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpLyhzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkrc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKStzdW0oZGF0YV9waXZvdCRCRUdJTk5FUikpKjEwMA0Kc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKS8oc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpK3N1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkrc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpKSoxMDANCnN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKS8oc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpK3N1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkrc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpKSoxMDANCmBgYA0KDQpgYGB7cn0NCmRhdGFfcGl2b3QgPC0gZGNhc3QoZWFzeVtlYXN5JGFjdGlvbiAlaW4lIGMoJ0xPQ0tFRF9GT1JfVkFMSURBVElPTicsJ0lOVkFMSURBVEVEJywnVkFMSURBVEVEJywnQVVUT19VTkxPQ0tFRF9GT1JfVkFMSURBVElPTicpLF0sIHByb2plY3RJZCB+IG1hcHBpbmdMZXZlbCx2YWx1ZS52YXIgPSAidXNlcm5hbWUiLCBmdW4uYWdncmVnYXRlID0gdW5pcXVlTikNCnN1bShkYXRhX3Bpdm90JEJFR0lOTkVSKS8oc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpK3N1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkrc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpKSoxMDANCnN1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpgYGANCg0KYGBge3J9DQptYXBwaW5nTGV2ZWwgPC0gZXZlbnRfbG9nX2RmW2V2ZW50X2xvZ19kZiRkaWZmaWN1bHR5ID09ICJFQVNZIixdICU+JSAgZ3JvdXBfYnkobWFwcGluZ0xldmVsKSAlPiUgc3VtbWFyaXNlKGNvdW50ID0gbl9kaXN0aW5jdChhY3Rpb25CeSkpDQptYXBwaW5nTGV2ZWwkcGVyY2VudGFnZSA8LSByb3VuZChtYXBwaW5nTGV2ZWwkY291bnQvc3VtKG1hcHBpbmdMZXZlbCRjb3VudCkqMTAwLDEpDQptYXBwaW5nTGV2ZWwNCmBgYA0KDQpgYGB7cn0NCmRhdGFfcGl2b3QgPC0gZGNhc3QoZXZlbnRfbG9nX2RmW2V2ZW50X2xvZ19kZiRkaWZmaWN1bHR5ID09ICJNT0RFUkFURSIsXSwgYWN0aW9uIH4gbWFwcGluZ0xldmVsLHZhbHVlLnZhciA9ICJ0YXNrSWQiLCBsZW5ndGgpDQpkYXRhX3Bpdm90JHN1bSA8LSAgZGF0YV9waXZvdCRBRFZBTkNFRCArIGRhdGFfcGl2b3QkQkVHSU5ORVIgKyBkYXRhX3Bpdm90JElOVEVSTUVESUFURQ0KZGF0YV9waXZvdCRBRFZBTkNFRHBlciA8LSByb3VuZChkYXRhX3Bpdm90JEFEVkFOQ0VEL2RhdGFfcGl2b3Qkc3VtKjEwMCwxKQ0KZGF0YV9waXZvdCRCRUdJTk5FUnBlciA8LSByb3VuZChkYXRhX3Bpdm90JEJFR0lOTkVSL2RhdGFfcGl2b3Qkc3VtKjEwMCwxKQ0KZGF0YV9waXZvdCRJTlRFUk1FRElBVEVwZXIgPC0gcm91bmQoZGF0YV9waXZvdCRJTlRFUk1FRElBVEUvZGF0YV9waXZvdCRzdW0qMTAwLDEpDQpkYXRhX3Bpdm90W2MoImFjdGlvbiIsIkFEVkFOQ0VEcGVyIiwiQkVHSU5ORVJwZXIiLCJJTlRFUk1FRElBVEVwZXIiKV0gJT4lIGd0KCkgJT4lICBkYXRhX2NvbG9yKGNvbHVtbnMgPSAyOjQsIGNvbG9ycyA9IGNvbF9udW1lcmljKHBhbGV0dGUgPSBjKCJ3aGl0ZSIsImRhcmtncmVlbiIpLGRvbWFpbiA9IGMoMCwxMDApKSkNCmBgYA0KDQpgYGB7cn0NCm1vZGVyYXRlIDwtIGV2ZW50X2xvZ19kZltldmVudF9sb2dfZGYkZGlmZmljdWx0eSA9PSAiTU9ERVJBVEUiLF0NCmRhdGFfcGl2b3QgPC0gZGNhc3QobW9kZXJhdGVbbW9kZXJhdGUkYWN0aW9uICVpbiUgYygnTE9DS0VEX0ZPUl9NQVBQSU5HJywnTUFQUEVEJywnQVVUT19VTkxPQ0tFRF9GT1JfTUFQUElORycsJ1NQTElUJywnQkFESU1BR0VSWScpLF0sIHByb2plY3RJZCB+IG1hcHBpbmdMZXZlbCx2YWx1ZS52YXIgPSAidXNlcm5hbWUiLCBmdW4uYWdncmVnYXRlID0gdW5pcXVlTikNCnN1bShkYXRhX3Bpdm90JEJFR0lOTkVSKS8oc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpK3N1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkrc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpKSoxMDANCnN1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpgYGANCg0KYGBge3J9DQpkYXRhX3Bpdm90IDwtIGRjYXN0KG1vZGVyYXRlW21vZGVyYXRlJGFjdGlvbiAlaW4lIGMoJ0xPQ0tFRF9GT1JfVkFMSURBVElPTicsJ0lOVkFMSURBVEVEJywnVkFMSURBVEVEJywnQVVUT19VTkxPQ0tFRF9GT1JfVkFMSURBVElPTicpLF0sIHByb2plY3RJZCB+IG1hcHBpbmdMZXZlbCx2YWx1ZS52YXIgPSAidXNlcm5hbWUiLCBmdW4uYWdncmVnYXRlID0gdW5pcXVlTikNCnN1bShkYXRhX3Bpdm90JEJFR0lOTkVSKS8oc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpK3N1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkrc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpKSoxMDANCnN1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpgYGANCg0KYGBge3J9DQptYXBwaW5nTGV2ZWwgPC0gZXZlbnRfbG9nX2RmW2V2ZW50X2xvZ19kZiRkaWZmaWN1bHR5ID09ICJNT0RFUkFURSIsXSAlPiUgIGdyb3VwX2J5KG1hcHBpbmdMZXZlbCkgJT4lIHN1bW1hcmlzZShjb3VudCA9IG5fZGlzdGluY3QoYWN0aW9uQnkpKQ0KbWFwcGluZ0xldmVsJHBlcmNlbnRhZ2UgPC0gcm91bmQobWFwcGluZ0xldmVsJGNvdW50L3N1bShtYXBwaW5nTGV2ZWwkY291bnQpKjEwMCwxKQ0KbWFwcGluZ0xldmVsDQpgYGANCg0KYGBge3J9DQpkYXRhX3Bpdm90IDwtIGRjYXN0KGV2ZW50X2xvZ19kZltldmVudF9sb2dfZGYkZGlmZmljdWx0eSA9PSAiQ0hBTExFTkdJTkciLF0sIGFjdGlvbiB+IG1hcHBpbmdMZXZlbCx2YWx1ZS52YXIgPSAidGFza0lkIiwgbGVuZ3RoKQ0KZGF0YV9waXZvdCRzdW0gPC0gIGRhdGFfcGl2b3QkQURWQU5DRUQgKyBkYXRhX3Bpdm90JEJFR0lOTkVSICsgZGF0YV9waXZvdCRJTlRFUk1FRElBVEUNCmRhdGFfcGl2b3QkQURWQU5DRURwZXIgPC0gcm91bmQoZGF0YV9waXZvdCRBRFZBTkNFRC9kYXRhX3Bpdm90JHN1bSoxMDAsMSkNCmRhdGFfcGl2b3QkQkVHSU5ORVJwZXIgPC0gcm91bmQoZGF0YV9waXZvdCRCRUdJTk5FUi9kYXRhX3Bpdm90JHN1bSoxMDAsMSkNCmRhdGFfcGl2b3QkSU5URVJNRURJQVRFcGVyIDwtIHJvdW5kKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFL2RhdGFfcGl2b3Qkc3VtKjEwMCwxKQ0KZGF0YV9waXZvdFtjKCJhY3Rpb24iLCJBRFZBTkNFRHBlciIsIkJFR0lOTkVScGVyIiwiSU5URVJNRURJQVRFcGVyIildICU+JSBndCgpICU+JSAgZGF0YV9jb2xvcihjb2x1bW5zID0gMjo0LCBjb2xvcnMgPSBjb2xfbnVtZXJpYyhwYWxldHRlID0gYygid2hpdGUiLCJkYXJrZ3JlZW4iKSxkb21haW4gPSBjKDAsMTAwKSkpDQpgYGANCg0KYGBge3J9DQpjaGFsbGVuZ2luZyA8LSBldmVudF9sb2dfZGZbZXZlbnRfbG9nX2RmJGRpZmZpY3VsdHkgPT0gIkNIQUxMRU5HSU5HIixdDQpkYXRhX3Bpdm90IDwtIGRjYXN0KGNoYWxsZW5naW5nW2NoYWxsZW5naW5nJGFjdGlvbiAlaW4lIGMoJ0xPQ0tFRF9GT1JfTUFQUElORycsJ01BUFBFRCcsJ0FVVE9fVU5MT0NLRURfRk9SX01BUFBJTkcnLCdTUExJVCcsJ0JBRElNQUdFUlknKSxdLCBwcm9qZWN0SWQgfiBtYXBwaW5nTGV2ZWwsdmFsdWUudmFyID0gInVzZXJuYW1lIiwgZnVuLmFnZ3JlZ2F0ZSA9IHVuaXF1ZU4pDQpzdW0oZGF0YV9waXZvdCRCRUdJTk5FUikvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpLyhzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkrc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKStzdW0oZGF0YV9waXZvdCRCRUdJTk5FUikpKjEwMA0Kc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpLyhzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkrc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKStzdW0oZGF0YV9waXZvdCRCRUdJTk5FUikpKjEwMA0KYGBgDQoNCmBgYHtyfQ0KZGF0YV9waXZvdCA8LSBkY2FzdChjaGFsbGVuZ2luZ1tjaGFsbGVuZ2luZyRhY3Rpb24gJWluJSBjKCdMT0NLRURfRk9SX1ZBTElEQVRJT04nLCdJTlZBTElEQVRFRCcsJ1ZBTElEQVRFRCcsJ0FVVE9fVU5MT0NLRURfRk9SX1ZBTElEQVRJT04nKSxdLCBwcm9qZWN0SWQgfiBtYXBwaW5nTGV2ZWwsdmFsdWUudmFyID0gInVzZXJuYW1lIiwgZnVuLmFnZ3JlZ2F0ZSA9IHVuaXF1ZU4pDQpzdW0oZGF0YV9waXZvdCRCRUdJTk5FUikvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpLyhzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkrc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKStzdW0oZGF0YV9waXZvdCRCRUdJTk5FUikpKjEwMA0Kc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpLyhzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkrc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKStzdW0oZGF0YV9waXZvdCRCRUdJTk5FUikpKjEwMA0KYGBgDQoNCmBgYHtyfQ0KbWFwcGluZ0xldmVsIDwtIGV2ZW50X2xvZ19kZltldmVudF9sb2dfZGYkZGlmZmljdWx0eSA9PSAiQ0hBTExFTkdJTkciLF0gJT4lICBncm91cF9ieShtYXBwaW5nTGV2ZWwpICU+JSBzdW1tYXJpc2UoY291bnQgPSBuX2Rpc3RpbmN0KGFjdGlvbkJ5KSkNCm1hcHBpbmdMZXZlbCRwZXJjZW50YWdlIDwtIHJvdW5kKG1hcHBpbmdMZXZlbCRjb3VudC9zdW0obWFwcGluZ0xldmVsJGNvdW50KSoxMDAsMSkNCm1hcHBpbmdMZXZlbA0KYGBgDQoNCmBgYHtyfQ0KZGF0YV9waXZvdCA8LSBkY2FzdChldmVudF9sb2dfZGZbZXZlbnRfbG9nX2RmJHByaW9yaXR5ID09ICJMT1ciLF0sIGFjdGlvbiB+IG1hcHBpbmdMZXZlbCx2YWx1ZS52YXIgPSAidGFza0lkIiwgbGVuZ3RoKQ0KZGF0YV9waXZvdCRzdW0gPC0gIGRhdGFfcGl2b3QkQURWQU5DRUQgKyBkYXRhX3Bpdm90JEJFR0lOTkVSICsgZGF0YV9waXZvdCRJTlRFUk1FRElBVEUNCmRhdGFfcGl2b3QkQURWQU5DRURwZXIgPC0gcm91bmQoZGF0YV9waXZvdCRBRFZBTkNFRC9kYXRhX3Bpdm90JHN1bSoxMDAsMSkNCmRhdGFfcGl2b3QkQkVHSU5ORVJwZXIgPC0gcm91bmQoZGF0YV9waXZvdCRCRUdJTk5FUi9kYXRhX3Bpdm90JHN1bSoxMDAsMSkNCmRhdGFfcGl2b3QkSU5URVJNRURJQVRFcGVyIDwtIHJvdW5kKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFL2RhdGFfcGl2b3Qkc3VtKjEwMCwxKQ0KZGF0YV9waXZvdFtjKCJhY3Rpb24iLCJBRFZBTkNFRHBlciIsIkJFR0lOTkVScGVyIiwiSU5URVJNRURJQVRFcGVyIildICU+JSBndCgpICU+JSAgZGF0YV9jb2xvcihjb2x1bW5zID0gMjo0LCBjb2xvcnMgPSBjb2xfbnVtZXJpYyhwYWxldHRlID0gYygid2hpdGUiLCJkYXJrZ3JlZW4iKSxkb21haW4gPSBjKDAsMTAwKSkpDQpgYGANCg0KYGBge3J9DQpsb3cgPC0gZXZlbnRfbG9nX2RmW2V2ZW50X2xvZ19kZiRwcmlvcml0eSA9PSAiTE9XIixdDQpkYXRhX3Bpdm90IDwtIGRjYXN0KGxvd1tsb3ckYWN0aW9uICVpbiUgYygnTE9DS0VEX0ZPUl9NQVBQSU5HJywnTUFQUEVEJywnQVVUT19VTkxPQ0tFRF9GT1JfTUFQUElORycsJ1NQTElUJywnQkFESU1BR0VSWScpLF0sIHByb2plY3RJZCB+IG1hcHBpbmdMZXZlbCx2YWx1ZS52YXIgPSAidXNlcm5hbWUiLCBmdW4uYWdncmVnYXRlID0gdW5pcXVlTikNCnN1bShkYXRhX3Bpdm90JEJFR0lOTkVSKS8oc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpK3N1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkrc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpKSoxMDANCnN1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpgYGANCg0KYGBge3J9DQpkYXRhX3Bpdm90IDwtIGRjYXN0KGxvd1tsb3ckYWN0aW9uICVpbiUgYygnTE9DS0VEX0ZPUl9WQUxJREFUSU9OJywnSU5WQUxJREFURUQnLCdWQUxJREFURUQnLCdBVVRPX1VOTE9DS0VEX0ZPUl9WQUxJREFUSU9OJyksXSwgcHJvamVjdElkIH4gbWFwcGluZ0xldmVsLHZhbHVlLnZhciA9ICJ1c2VybmFtZSIsIGZ1bi5hZ2dyZWdhdGUgPSB1bmlxdWVOKQ0Kc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpLyhzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkrc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKStzdW0oZGF0YV9waXZvdCRCRUdJTk5FUikpKjEwMA0Kc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKS8oc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpK3N1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkrc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpKSoxMDANCnN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKS8oc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpK3N1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkrc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpKSoxMDANCmBgYA0KDQpgYGB7cn0NCm1hcHBpbmdMZXZlbCA8LSBldmVudF9sb2dfZGZbZXZlbnRfbG9nX2RmJHByaW9yaXR5ID09ICJMT1ciLF0gJT4lICBncm91cF9ieShtYXBwaW5nTGV2ZWwpICU+JSBzdW1tYXJpc2UoY291bnQgPSBuX2Rpc3RpbmN0KGFjdGlvbkJ5KSkNCm1hcHBpbmdMZXZlbCRwZXJjZW50YWdlIDwtIHJvdW5kKG1hcHBpbmdMZXZlbCRjb3VudC9zdW0obWFwcGluZ0xldmVsJGNvdW50KSoxMDAsMSkNCm1hcHBpbmdMZXZlbA0KYGBgDQoNCmBgYHtyfQ0KZGF0YV9waXZvdCA8LSBkY2FzdChldmVudF9sb2dfZGZbZXZlbnRfbG9nX2RmJHByaW9yaXR5ID09ICJNRURJVU0iLF0sIGFjdGlvbiB+IG1hcHBpbmdMZXZlbCx2YWx1ZS52YXIgPSAidGFza0lkIiwgbGVuZ3RoKQ0KZGF0YV9waXZvdCRzdW0gPC0gIGRhdGFfcGl2b3QkQURWQU5DRUQgKyBkYXRhX3Bpdm90JEJFR0lOTkVSICsgZGF0YV9waXZvdCRJTlRFUk1FRElBVEUNCmRhdGFfcGl2b3QkQURWQU5DRURwZXIgPC0gcm91bmQoZGF0YV9waXZvdCRBRFZBTkNFRC9kYXRhX3Bpdm90JHN1bSoxMDAsMSkNCmRhdGFfcGl2b3QkQkVHSU5ORVJwZXIgPC0gcm91bmQoZGF0YV9waXZvdCRCRUdJTk5FUi9kYXRhX3Bpdm90JHN1bSoxMDAsMSkNCmRhdGFfcGl2b3QkSU5URVJNRURJQVRFcGVyIDwtIHJvdW5kKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFL2RhdGFfcGl2b3Qkc3VtKjEwMCwxKQ0KZGF0YV9waXZvdFtjKCJhY3Rpb24iLCJBRFZBTkNFRHBlciIsIkJFR0lOTkVScGVyIiwiSU5URVJNRURJQVRFcGVyIildICU+JSBndCgpICU+JSAgZGF0YV9jb2xvcihjb2x1bW5zID0gMjo0LCBjb2xvcnMgPSBjb2xfbnVtZXJpYyhwYWxldHRlID0gYygid2hpdGUiLCJkYXJrZ3JlZW4iKSxkb21haW4gPSBjKDAsMTAwKSkpDQpgYGANCg0KYGBge3J9DQptZWRpdW0gPC0gZXZlbnRfbG9nX2RmW2V2ZW50X2xvZ19kZiRwcmlvcml0eSA9PSAiTUVESVVNIixdDQpkYXRhX3Bpdm90IDwtIGRjYXN0KG1lZGl1bVttZWRpdW0kYWN0aW9uICVpbiUgYygnTE9DS0VEX0ZPUl9NQVBQSU5HJywnTUFQUEVEJywnQVVUT19VTkxPQ0tFRF9GT1JfTUFQUElORycsJ1NQTElUJywnQkFESU1BR0VSWScpLF0sIHByb2plY3RJZCB+IG1hcHBpbmdMZXZlbCx2YWx1ZS52YXIgPSAidXNlcm5hbWUiLCBmdW4uYWdncmVnYXRlID0gdW5pcXVlTikNCnN1bShkYXRhX3Bpdm90JEJFR0lOTkVSKS8oc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpK3N1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkrc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpKSoxMDANCnN1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpgYGANCg0KYGBge3J9DQpkYXRhX3Bpdm90IDwtIGRjYXN0KG1lZGl1bVttZWRpdW0kYWN0aW9uICVpbiUgYygnTE9DS0VEX0ZPUl9WQUxJREFUSU9OJywnSU5WQUxJREFURUQnLCdWQUxJREFURUQnLCdBVVRPX1VOTE9DS0VEX0ZPUl9WQUxJREFUSU9OJyksXSwgcHJvamVjdElkIH4gbWFwcGluZ0xldmVsLHZhbHVlLnZhciA9ICJ1c2VybmFtZSIsIGZ1bi5hZ2dyZWdhdGUgPSB1bmlxdWVOKQ0Kc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpLyhzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkrc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKStzdW0oZGF0YV9waXZvdCRCRUdJTk5FUikpKjEwMA0Kc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKS8oc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpK3N1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkrc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpKSoxMDANCnN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKS8oc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpK3N1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkrc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpKSoxMDANCmBgYA0KDQpgYGB7cn0NCm1hcHBpbmdMZXZlbCA8LSBldmVudF9sb2dfZGZbZXZlbnRfbG9nX2RmJHByaW9yaXR5ID09ICJNRURJVU0iLF0gJT4lICBncm91cF9ieShtYXBwaW5nTGV2ZWwpICU+JSBzdW1tYXJpc2UoY291bnQgPSBuX2Rpc3RpbmN0KGFjdGlvbkJ5KSkNCm1hcHBpbmdMZXZlbCRwZXJjZW50YWdlIDwtIHJvdW5kKG1hcHBpbmdMZXZlbCRjb3VudC9zdW0obWFwcGluZ0xldmVsJGNvdW50KSoxMDAsMSkNCm1hcHBpbmdMZXZlbA0KYGBgDQoNCmBgYHtyfQ0KZGF0YV9waXZvdCA8LSBkY2FzdChldmVudF9sb2dfZGZbZXZlbnRfbG9nX2RmJHByaW9yaXR5ID09ICJISUdIIixdLCBhY3Rpb24gfiBtYXBwaW5nTGV2ZWwsdmFsdWUudmFyID0gInRhc2tJZCIsIGxlbmd0aCkNCmRhdGFfcGl2b3Qkc3VtIDwtICBkYXRhX3Bpdm90JEFEVkFOQ0VEICsgZGF0YV9waXZvdCRCRUdJTk5FUiArIGRhdGFfcGl2b3QkSU5URVJNRURJQVRFDQpkYXRhX3Bpdm90JEFEVkFOQ0VEcGVyIDwtIHJvdW5kKGRhdGFfcGl2b3QkQURWQU5DRUQvZGF0YV9waXZvdCRzdW0qMTAwLDEpDQpkYXRhX3Bpdm90JEJFR0lOTkVScGVyIDwtIHJvdW5kKGRhdGFfcGl2b3QkQkVHSU5ORVIvZGF0YV9waXZvdCRzdW0qMTAwLDEpDQpkYXRhX3Bpdm90JElOVEVSTUVESUFURXBlciA8LSByb3VuZChkYXRhX3Bpdm90JElOVEVSTUVESUFURS9kYXRhX3Bpdm90JHN1bSoxMDAsMSkNCmRhdGFfcGl2b3RbYygiYWN0aW9uIiwiQURWQU5DRURwZXIiLCJCRUdJTk5FUnBlciIsIklOVEVSTUVESUFURXBlciIpXSAlPiUgZ3QoKSAlPiUgIGRhdGFfY29sb3IoY29sdW1ucyA9IDI6NCwgY29sb3JzID0gY29sX251bWVyaWMocGFsZXR0ZSA9IGMoIndoaXRlIiwiZGFya2dyZWVuIiksZG9tYWluID0gYygwLDEwMCkpKQ0KYGBgDQoNCmBgYHtyfQ0KaGlnaCA8LSBldmVudF9sb2dfZGZbZXZlbnRfbG9nX2RmJHByaW9yaXR5ID09ICJISUdIIixdDQpkYXRhX3Bpdm90IDwtIGRjYXN0KGhpZ2hbaGlnaCRhY3Rpb24gJWluJSBjKCdMT0NLRURfRk9SX01BUFBJTkcnLCdNQVBQRUQnLCdBVVRPX1VOTE9DS0VEX0ZPUl9NQVBQSU5HJywnU1BMSVQnLCdCQURJTUFHRVJZJyksXSwgcHJvamVjdElkIH4gbWFwcGluZ0xldmVsLHZhbHVlLnZhciA9ICJ1c2VybmFtZSIsIGZ1bi5hZ2dyZWdhdGUgPSB1bmlxdWVOKQ0Kc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpLyhzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkrc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKStzdW0oZGF0YV9waXZvdCRCRUdJTk5FUikpKjEwMA0Kc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKS8oc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpK3N1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkrc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpKSoxMDANCnN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKS8oc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpK3N1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkrc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpKSoxMDANCmBgYA0KDQpgYGB7cn0NCmRhdGFfcGl2b3QgPC0gZGNhc3QoaGlnaFtoaWdoJGFjdGlvbiAlaW4lIGMoJ0xPQ0tFRF9GT1JfVkFMSURBVElPTicsJ0lOVkFMSURBVEVEJywnVkFMSURBVEVEJywnQVVUT19VTkxPQ0tFRF9GT1JfVkFMSURBVElPTicpLF0sIHByb2plY3RJZCB+IG1hcHBpbmdMZXZlbCx2YWx1ZS52YXIgPSAidXNlcm5hbWUiLCBmdW4uYWdncmVnYXRlID0gdW5pcXVlTikNCnN1bShkYXRhX3Bpdm90JEJFR0lOTkVSKS8oc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpK3N1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkrc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpKSoxMDANCnN1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpgYGANCg0KYGBge3J9DQptYXBwaW5nTGV2ZWwgPC0gZXZlbnRfbG9nX2RmW2V2ZW50X2xvZ19kZiRwcmlvcml0eSA9PSAiSElHSCIsXSAlPiUgIGdyb3VwX2J5KG1hcHBpbmdMZXZlbCkgJT4lIHN1bW1hcmlzZShjb3VudCA9IG5fZGlzdGluY3QoYWN0aW9uQnkpKQ0KbWFwcGluZ0xldmVsJHBlcmNlbnRhZ2UgPC0gcm91bmQobWFwcGluZ0xldmVsJGNvdW50L3N1bShtYXBwaW5nTGV2ZWwkY291bnQpKjEwMCwxKQ0KbWFwcGluZ0xldmVsDQpgYGANCg0KYGBge3J9DQpkYXRhX3Bpdm90IDwtIGRjYXN0KGV2ZW50X2xvZ19kZltldmVudF9sb2dfZGYkcHJpb3JpdHkgPT0gIlVSR0VOVCIsXSwgYWN0aW9uIH4gbWFwcGluZ0xldmVsLHZhbHVlLnZhciA9ICJ0YXNrSWQiLCBsZW5ndGgpDQpkYXRhX3Bpdm90JHN1bSA8LSAgZGF0YV9waXZvdCRBRFZBTkNFRCArIGRhdGFfcGl2b3QkQkVHSU5ORVIgKyBkYXRhX3Bpdm90JElOVEVSTUVESUFURQ0KZGF0YV9waXZvdCRBRFZBTkNFRHBlciA8LSByb3VuZChkYXRhX3Bpdm90JEFEVkFOQ0VEL2RhdGFfcGl2b3Qkc3VtKjEwMCwxKQ0KZGF0YV9waXZvdCRCRUdJTk5FUnBlciA8LSByb3VuZChkYXRhX3Bpdm90JEJFR0lOTkVSL2RhdGFfcGl2b3Qkc3VtKjEwMCwxKQ0KZGF0YV9waXZvdCRJTlRFUk1FRElBVEVwZXIgPC0gcm91bmQoZGF0YV9waXZvdCRJTlRFUk1FRElBVEUvZGF0YV9waXZvdCRzdW0qMTAwLDEpDQpkYXRhX3Bpdm90W2MoImFjdGlvbiIsIkFEVkFOQ0VEcGVyIiwiQkVHSU5ORVJwZXIiLCJJTlRFUk1FRElBVEVwZXIiKV0gJT4lIGd0KCkgJT4lICBkYXRhX2NvbG9yKGNvbHVtbnMgPSAyOjQsIGNvbG9ycyA9IGNvbF9udW1lcmljKHBhbGV0dGUgPSBjKCJ3aGl0ZSIsImRhcmtncmVlbiIpLGRvbWFpbiA9IGMoMCwxMDApKSkNCmBgYA0KDQpgYGB7cn0NCnVyZ2VudCA8LSBldmVudF9sb2dfZGZbZXZlbnRfbG9nX2RmJHByaW9yaXR5ID09ICJVUkdFTlQiLF0NCmRhdGFfcGl2b3QgPC0gZGNhc3QodXJnZW50W3VyZ2VudCRhY3Rpb24gJWluJSBjKCdMT0NLRURfRk9SX01BUFBJTkcnLCdNQVBQRUQnLCdBVVRPX1VOTE9DS0VEX0ZPUl9NQVBQSU5HJywnU1BMSVQnLCdCQURJTUFHRVJZJyksXSwgcHJvamVjdElkIH4gbWFwcGluZ0xldmVsLHZhbHVlLnZhciA9ICJ1c2VybmFtZSIsIGZ1bi5hZ2dyZWdhdGUgPSB1bmlxdWVOKQ0Kc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpLyhzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkrc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKStzdW0oZGF0YV9waXZvdCRCRUdJTk5FUikpKjEwMA0Kc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKS8oc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpK3N1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkrc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpKSoxMDANCnN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKS8oc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpK3N1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkrc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpKSoxMDANCmBgYA0KDQpgYGB7cn0NCmRhdGFfcGl2b3QgPC0gZGNhc3QodXJnZW50W3VyZ2VudCRhY3Rpb24gJWluJSBjKCdMT0NLRURfRk9SX1ZBTElEQVRJT04nLCdJTlZBTElEQVRFRCcsJ1ZBTElEQVRFRCcsJ0FVVE9fVU5MT0NLRURfRk9SX1ZBTElEQVRJT04nKSxdLCBwcm9qZWN0SWQgfiBtYXBwaW5nTGV2ZWwsdmFsdWUudmFyID0gInVzZXJuYW1lIiwgZnVuLmFnZ3JlZ2F0ZSA9IHVuaXF1ZU4pDQpzdW0oZGF0YV9waXZvdCRCRUdJTk5FUikvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpLyhzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkrc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKStzdW0oZGF0YV9waXZvdCRCRUdJTk5FUikpKjEwMA0Kc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpLyhzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkrc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKStzdW0oZGF0YV9waXZvdCRCRUdJTk5FUikpKjEwMA0KYGBgDQoNCmBgYHtyfQ0KbWFwcGluZ0xldmVsIDwtIGV2ZW50X2xvZ19kZltldmVudF9sb2dfZGYkcHJpb3JpdHkgPT0gIlVSR0VOVCIsXSAlPiUgIGdyb3VwX2J5KG1hcHBpbmdMZXZlbCkgJT4lIHN1bW1hcmlzZShjb3VudCA9IG5fZGlzdGluY3QoYWN0aW9uQnkpKQ0KbWFwcGluZ0xldmVsJHBlcmNlbnRhZ2UgPC0gcm91bmQobWFwcGluZ0xldmVsJGNvdW50L3N1bShtYXBwaW5nTGV2ZWwkY291bnQpKjEwMCwxKQ0KbWFwcGluZ0xldmVsDQpgYGANCg==